﻿using Dlls;
using Persistencia;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using UI;
using UI.Views.Cadastros;
using UI.Views.Consultas;
using UI.Classes;

namespace UI.Views.Lancamentos.Produtos_Estoque
{
    /// <summary>
    /// Interaction logic for frmEntradaEstoque.xaml
    /// </summary>
    public partial class frmEntradaEstoque : Window
    {
        private ProdutosDLL produtoDll;
        private Context contexto;
        private Pessoa pessoa;
        private PessoasDLL pessoaDll;
        private Produto produto;
        private FormaPagamentoDLL fpagamentoDll;
        private Movimento DadosMovimento;
        private List<MovimentoItem> listMovimento;
        private MovimentoItemDLL movimentoItemDll;
        private MovimentoItem movimentoItems;
        private MovimentoDLL movimentoDll;
        private ContasAPagarDLL apagarDll;
        private int codigo;
        private int codigoParaAlterarOuDeletar = 0;
        private int codBanco;
        private EstoqueDLL estoqueDll;
        private Produto Produto;
        private decimal TotalPedido;

        public frmEntradaEstoque()
        {
            InitializeComponent();
            contexto = new Context();
            //     pessoa = new Pessoa();
            pessoaDll = new PessoasDLL();
            //Produto = new Produto();
            fpagamentoDll = new FormaPagamentoDLL();
            // formapagamento = new FormaPagamento();
            DadosMovimento = new Movimento();
            movimentoItems = new MovimentoItem();
            listMovimento = new List<MovimentoItem>();
            movimentoItemDll = new MovimentoItemDLL();
            movimentoDll = new MovimentoDLL();
            produtoDll = new ProdutosDLL();
            apagarDll = new ContasAPagarDLL();
            //caixabancoDll = new CaixaBancoDLL();
            cbxFPagamento.ItemsSource = fpagamentoDll.List().Select(o => o.Descricao.ToString());
            estoqueDll = new EstoqueDLL();
            // GridViewProdutos.ItemsSource = movimentoItemDll.List();

            if (codigo != 0)
            {
                codigoParaAlterarOuDeletar = codigo;
            }
        }
        private void InputCodigo(object sender, SelectionChangedEventArgs e)
        {
            if (cbxFPagamento.Text != "")
            {
                string nome = cbxFPagamento.Text.ToString();
                codBanco = int.Parse(fpagamentoDll.getCodigoPorNome(nome).Codigo.ToString());
            }

        }
        private void AdicionarProdutos(MovimentoItem items)
        {
            listMovimento.Add(items);
        }
        private void InsertOrUpdate(object sender, RoutedEventArgs e)
        {
            try
            {
                if (txtCodigoMovimento.Text == "")
                {
                    int totalProdutos = GridViewProdutos.SelectedItems.Count;
                    string nome = cbxFPagamento.SelectedItem.ToString();

                    DadosMovimento.DataMovimentacao = Convert.ToDateTime(txtDataEntrada.Text);
                    DadosMovimento.CodigoPessoa = int.Parse(txtCodFornecedor.Text);
                    DadosMovimento.TipoMovimentacao = "Entrada";
                    DadosMovimento.CodCaixaBanco = int.Parse(fpagamentoDll.getCodigoPorNome(nome).Codigo.ToString());
                    DadosMovimento.Total = decimal.Parse(lblTotal.Content.ToString());

                    movimentoDll.Insert(DadosMovimento);
                   // Inserir Conta A PAgar quando a COndição Financeira For
                    var Financeiro = fpagamentoDll.getFPagamento(int.Parse(DadosMovimento.CodCaixaBanco.ToString()));
                    if (Financeiro.GeraFinanceiroSN == true)
                    {
                        apagarDll.InserirConta(Convert.ToDateTime(DadosMovimento.DataMovimentacao), Convert.ToDateTime(DateTime.Now.ToString()), decimal.Parse(DadosMovimento.Total.ToString()), int.Parse(DadosMovimento.CodigoPessoa.ToString()), "TESTE", 1);
                    }
                    foreach (MovimentoItem Item in listMovimento)
                    {
                        Item.CodMovimento = DadosMovimento.Codigo;
                        Item.TipoMovimento = Convert.ToChar("E");

                        contexto.MovimentosItems.InsertOnSubmit(Item);
                       // movimentoItemDll.Insert(Item);
                    }

                    contexto.SubmitChanges();

                    DadosMovimento = new Movimento();
                    listMovimento = new List<MovimentoItem>();
                    GridViewProdutos.ItemsSource = null;
                    MessageBox.Show("Registro inserido com sucesso");
                }
                else
                {
                    int totalProdutos = GridViewProdutos.SelectedItems.Count;
                    string nome = cbxFPagamento.SelectedItem.ToString();

                    DadosMovimento.DataMovimentacao = Convert.ToDateTime(txtDataEntrada.Text);
                    DadosMovimento.CodigoPessoa = int.Parse(txtCodFornecedor.Text);
                    DadosMovimento.TipoMovimentacao = "Entrada";
                    DadosMovimento.CodCaixaBanco = int.Parse(fpagamentoDll.getCodigoPorNome(nome).Codigo.ToString());
                    DadosMovimento.Total = decimal.Parse(lblTotal.Content.ToString());

                    movimentoDll.Update(int.Parse(txtCodigoMovimento.Text), DadosMovimento);

                    foreach (MovimentoItem Item in listMovimento)
                    {
                        Item.CodMovimento = DadosMovimento.Codigo;
                        Item.TipoMovimento = Convert.ToChar("E");
                        movimentoItemDll.Update(int.Parse(DadosMovimento.Codigo.ToString()), Item);
                    }
                    DadosMovimento = new Movimento();
                    listMovimento = new List<MovimentoItem>();
                    GridViewProdutos.ItemsSource = null;
                    MessageBox.Show("Registro Atualizado com sucesso");

                }
                LimpaCampos.reset(0, this);
            }
            catch (Exception)
            {

                throw;
            }


        }

        private void Novo(object sender, RoutedEventArgs e)
        {
            LimpaCampos.reset(0, this);
        }
        private void Delete(object sender, RoutedEventArgs e)
        {

        }

        private void BuscarPessoa(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                if (txtCodFornecedor.Text == "")
                {
                    global.ReturnPessoa = null;
                    frmConsultaPadrao BuscaCliente = new frmConsultaPadrao("Pessoa");
                    BuscaCliente.ShowDialog();
                    if (global.ReturnPessoa != null)
                    {
                        txtCodFornecedor.Text = global.ReturnPessoa.Codigo.ToString();
                        txtNomeFornecedor.Text = global.ReturnPessoa.Nome.ToString();
                    }
                }
                else if (txtCodFornecedor.Text != "")
                {
                    Pessoa pessoa = pessoaDll.getPessoa(int.Parse(txtCodFornecedor.Text));
                    if (pessoa != null)
                    {
                        txtCodFornecedor.Text = pessoa.Codigo.ToString();
                        txtNomeFornecedor.Text = pessoa.Nome.ToString();
                    }
                    else
                    {
                        MessageBox.Show("Fornecedor não encontrado");
                    }
                }
            }
        }
        private Pessoa BuscarPessoa(int CodigoPessoa)
        {
            PessoasDLL pessoasDLL = new PessoasDLL();
            Pessoa pessoa = new Pessoa();
            pessoa = null;
            pessoa = pessoasDLL.getPessoa(CodigoPessoa);
            return pessoa;
        }

        private void InsereProduto(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {

                if (txtCodProduto.Text != "")
                {
                    Produto Produto = produtoDll.getProduto(int.Parse(txtCodProduto.Text));
                    Estoque estoque = estoqueDll.GetEstoque(int.Parse(txtCodProduto.Text));
                    if (Produto != null)
                    {
                        txtCodProduto.Text = Produto.Codigo.ToString();
                        txtNomeProduto.Text = Produto.Nome.ToString();
                        txtQuantidade.Text = "1";
                        this.txtQuantidade.Focus();
                        if (estoque != null)
                        {
                            txtValorUnitario.Text = estoque.ValorVenda.ToString();
                        }
                    }
                    else
                    {
                        MessageBox.Show("Produto não encontrado");
                    }
                }
                else
                {
                    global.ReturnProduto = null;
                    frmConsultaPadrao consulta = new frmConsultaPadrao("Produto");
                    consulta.ShowDialog();
                    if (global.ReturnProduto != null)
                    {
                        txtCodProduto.Text = global.ReturnProduto.Codigo.ToString();
                        txtNomeProduto.Text = global.ReturnProduto.Nome.ToString();
                        txtQuantidade.Text = "1";
                        txtValorUnitario.Text = estoqueDll.GetEstoque(int.Parse(txtCodProduto.Text)).ValorVenda.ToString();
                    }
                }
            }

        }
        private Produto InserirItens()
        {

            ProdutosDLL produtosDLL = new ProdutosDLL();
            Produto ItensMovimento = new Produto();
            //   ItensMovimento = produtoDll.getProduto(CodProdu);
            // ItensMovimento = null;
            return ItensMovimento;
        }

        private void ConfirmaValor(object sender, KeyEventArgs e)
        {

        }

        private void ConfirmaQuantia(object sender, KeyEventArgs e)
        {

            //decimal total = (decimal.Parse(txtValorUnitario.Text) * decimal.Parse(txtQuantidade.Text));
            //lblTotalProduto.Content = total.ToString();

        }

        private void InserirItens(object sender, RoutedEventArgs e)
        {
            //movimentoItems.Produto = new Persistencia.Produto(),
           
            MovimentoItem movimentoItem = new MovimentoItem()
            {
            CodProduto = int.Parse(txtCodProduto.Text),
            Produto = contexto.Produtos.FirstOrDefault(p => p.Codigo == int.Parse(txtCodProduto.Text)),
            ValorUnitario = decimal.Parse(txtValorUnitario.Text),
            Quantidade = decimal.Parse(txtQuantidade.Text),
            ValorTotal = decimal.Parse(lblTotal.Content.ToString()),
        };
           // movimentoItems.Produto = contexto.Produtos.SingleOrDefault(p => p.Codigo == int.Parse(txtCodProduto.Text));
            //movimentoItems.CodProduto = int.Parse(txtCodProduto.Text);
            //movimentoItems.Produto = produtoDll.getProduto(movimentoItems.CodProduto);
            //movimentoItems.ValorUnitario = decimal.Parse(txtValorUnitario.Text);
            //movimentoItems.Quantidade = decimal.Parse(txtQuantidade.Text);
            //movimentoItems.ValorTotal = decimal.Parse(lblTotal.Content.ToString());

            AdicionarProdutos(movimentoItem);
            GridViewProdutos.ItemsSource = null;
            GridViewProdutos.ItemsSource = listMovimento;


            foreach (MovimentoItem item in listMovimento)
            {
                TotalPedido += Convert.ToDecimal(item.Quantidade * item.ValorUnitario);
            }

            lblTotal.Content = TotalPedido.ToString();

             
            TotalPedido = 0;
            lblTotalProduto.Content = "0,00";
            txtCodProduto.Text = "";
            txtNomeProduto.Text = "";
            txtQuantidade.Text = "";
            txtValorUnitario.Text = "";
            // contexto.Dispose();
        }

        private void EditarEntrada(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                if (txtCodigoMovimento.Text == "")
                {
                    frmConsultaPadrao consultaPadrao = new frmConsultaPadrao("MovimentoEstoque");
                    consultaPadrao.Owner = this;
                    consultaPadrao.Show();
                }
                else if (txtCodigoMovimento.Text != "")
                {
                    Movimento movimento = movimentoDll.getMovimento(int.Parse(txtCodigoMovimento.Text), "Entrada");
                    if (movimento != null)
                    {
                        txtCodigoMovimento.Text = movimento.Codigo.ToString();
                        txtCodFornecedor.Text = movimento.CodigoPessoa.ToString();
                        txtNomeFornecedor.Text = pessoaDll.getPessoa(int.Parse(txtCodFornecedor.Text)).Nome;
                        txtDataEntrada.Text = movimento.DataMovimentacao.ToString();
                        cbxFPagamento.Text = fpagamentoDll.getFPagamento(int.Parse(movimento.CodCaixaBanco.ToString())).Descricao;
                        GridViewProdutos.ItemsSource = movimentoItemDll.List(movimento.Codigo);
                        lblTotal.Content = movimento.Total.ToString();
                    }
                    else
                    {
                        MessageBox.Show("Não registros com o código informado");
                    }

                }
            }
        }

        private void CalcularTotal(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter || e.Key == Key.Tab)
            {
                decimal valorunitario = decimal.Parse(txtValorUnitario.Text);
                decimal quantidade = decimal.Parse(txtQuantidade.Text);

                lblTotalProduto.Content = Convert.ToString(valorunitario * quantidade);
            }
        }

        private void RecalcularTotal(object sender, SelectedCellsChangedEventArgs e)
        {
            foreach (MovimentoItem item in GridViewProdutos.ItemsSource)
            {
                TotalPedido += Convert.ToDecimal(item.Quantidade * item.ValorUnitario);
            }

            lblTotal.Content = TotalPedido.ToString();
            TotalPedido = 0;
        }

        private void CalcularTotalItem(object sender, RoutedEventArgs e)
        {
            if (txtQuantidade.Text != "" && txtValorUnitario.Text != "")
            {
                decimal total = (decimal.Parse(txtValorUnitario.Text) * decimal.Parse(txtQuantidade.Text));
                lblTotalProduto.Content = total.ToString();
            }

        }

    }
}
